/*
 * K & R
 * 这段代码摘自K&R的v6中的源码, 请尊重K&R的成果
 */

#include	<stdio.h>
#include	<syscall.h>

struct tm xtime;
int dmsize[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

int	dysize(int y);

struct tm *
gmtime(time_t *tim)
{
	int *tp;
	int d0, d1;
	int hms, day;

	hms = *tim % 86400;
	day = *tim / 86400;
	if(hms < 0){
		hms += 86400;
		day -= 1;
	}
	tp = (int *)&xtime;
	*tp++ = hms % 60;
	d1 = hms / 60;
	*tp++ = d1 % 60;
	d1 /= 60;
	*tp++ = d1;
	xtime.t_wday = (day + 7340036) % 7;
	if(day >= 0){
		for(d1 = 70; day >= dysize(d1); d1++)
			day -= dysize(d1);
	}else{
		for(d1 = 70; day < 0; d1--)
			day += dysize(d1 - 1);
	}
	xtime.t_year = d1;
	xtime.t_yday = d0 = day;
	if(dysize(d1) == 366)
		dmsize[1] = 29;
	for(d1 = 0; d0 >= dmsize[d1]; d1++)
		d0 -= dmsize[d1];
	dmsize[1] = 28;
	*tp++ = d0 + 1;
	*tp++ = d1;
	xtime.t_isdst = 0;
	return (&xtime);
}

int
dysize(int y)
{
	if((y % 4) == 0)
		return 366;
	return 365;
}
